//------------------------------------------------------------------------------------------------------------------
//CONSTANTES
//------------------------------------------------------------------------------------------------------------------
var KEY_TIPO_ESTADISTICA_FLUJOS_POR_ESTADO = "FlujosPorEstado";
var KEY_TIPO_ESTADISTICA_PORCENTAJE_POR_APROBADOR = "PorcentajePorAprobador";
var GRAFICO_BARRA = "barra";
var GRAFICO_TORTA = "torta";
var GRAFICO_LINEA = "linea";

//-------------------------------------------------------------------------------------
//Descripcion : obtiene la llave de la Estadistica
//Por         : VSR, 18/04/2012
function EST_ObtenerKeyEstadistica(){
  var ddlEstadistica = document.getElementById(prefijoControl +"ddlEstadistica_ddlCombo");
  var queryString = "";
  var idEstadistica = "";

  try {
    idEstadistica = (IsValid_Empty(ddlEstadistica)) ? "-1":ddlEstadistica.value;
    //construye queryString
    queryString += "page=Workflow.HttpAjax";
    queryString += "&op=ObtenerKeyEstadisticaJSON";
    queryString += "&idEstadistica="+ idEstadistica;

    var okFunc = function(t) {
      var respuesta = jQuery.trim(t);
      if (respuesta == CONST_CODIGO_SQL_ERROR) {
        alert("Ha ocurrido un error interno y no se pudo obtener la llave del tipo estadística");
      }
      else {
        EST_CargarDatosEstadistica(respuesta);
      }
    }
    var errFunc = function(t) {
      alert("Ha ocurrido un error interno y no se pudo obtener la llave del tipo estadística");
    }
    jQuery.ajax({
      url: "index.php",
      type: "post",
      async: false,
      data: queryString,
      success: okFunc,
      error: errFunc
    });
  }
  catch(e){
    if (e.description){ //para IE
      alert("Exception:\n" + e.description)
    }
    else{ // otro navegador
      alert("Exception:\n" + e)
    }
    return false;
  }
}

//------------------------------------------------------------------------------------
//Descripcion: carga los datos relacionados con la estadistica seleccionada
//Por        : VSR, 18/04/2012
function EST_CargarDatosEstadistica(estructuraJSON){
  var txtKeyEstadistica = document.getElementById(prefijoControl +"txtKeyEstadistica");
  var txtTipoGrafico = document.getElementById(prefijoControl +"txtTipoGrafico");
  var lblTipoGrafico = document.getElementById(prefijoControl +"lblTipoGrafico");
  var data = jQuery.parseJSON(estructuraJSON);
  var sinDato = "";
  var themeBaseUrl = obtenerThemeBaseUrl();

  try {
    if(data){
      if(data.length == 0){
        txtKeyEstadistica.value = sinDato;
        txtTipoGrafico.value = sinDato;
      } else {
        data = data[0];
        txtKeyEstadistica.value = (data.Llave) ? data.Llave:sinDato;
        txtTipoGrafico.value = (data.TipoGrafico) ? data.TipoGrafico:sinDato;

        if(data.TipoGrafico=="barra"){
          lblTipoGrafico.innerHTML = "<img src='"+ themeBaseUrl +"/img/grafico-barra.png' alt='barra' title='barra' />";
        } else if(data.TipoGrafico=="torta"){
          lblTipoGrafico.innerHTML = "<img src='"+ themeBaseUrl +"/img/grafico-torta.png' alt='torta' title='torta' />";
        }else if(data.TipoGrafico=="linea"){
          lblTipoGrafico.innerHTML = "<img src='"+ themeBaseUrl +"/img/grafico-linea.png' alt='linea' title='linea' />";
        }else {
          lblTipoGrafico.innerHTML = "<img src='"+ themeBaseUrl +"/img/grafico-barra.png' alt='barra' title='barra' />";
        }
      }
    }
    else{
      txtKeyEstadistica.value = sinDato;
      txtTipoGrafico.value = sinDato;
      alert("No se pudo cargar los datos de la estadística");
    }
  }
  catch(e){
    if (e.description){ //para IE
      txtKeyEstadistica.value = sinDato;
      txtTipoGrafico.value = sinDato;
      alert("Exception:\n" + e.description)
    }
    else{ // otro navegador
      txtKeyEstadistica.value = sinDato;
      txtTipoGrafico.value = sinDato;
      alert("Exception:\n" + e)
    }
    return false;
  }
}

//-------------------------------------------------------------------------------------
//Descripcion : muestra los controles relacionados con el tipo de estadistica seleccionado
//Por         : VSR, 18/04/2012
function EST_MostrarControlesEstadistica(){
  EST_ObtenerKeyEstadistica();
  var txtKeyEstadistica = document.getElementById(prefijoControl +"txtKeyEstadistica");
  var keyEstadistica = txtKeyEstadistica.value;

  //si no selecciona ningun valor entonces oculta todos los controles
  if(IsValid_Empty(txtKeyEstadistica)){
    EST_SetVisibleControlesFull(false);
  }
  else{
    //oculta todos los controles
    EST_SetVisibleControlesFull(false);
    //obtiene la key para saber que controles mostrar
    switch(keyEstadistica){
      case KEY_TIPO_ESTADISTICA_FLUJOS_POR_ESTADO:
        EST_SetVisibleControlesFlujosPorEstado(true);
        break;
      case KEY_TIPO_ESTADISTICA_PORCENTAJE_POR_APROBADOR:
        EST_SetVisibleControlesPorcentajePorAprobador(true);
        break;
      default:
        EST_SetVisibleControlesGenerales(true);
    }
  }
}

//-------------------------------------------------------------------------------------
//Descripcion : genera la estadistica segun la opcion seleccionada
//Por         : VSR, 18/04/2012
function EST_GenerarEstadistica(){
  var pnlMensajeUsuario = document.getElementById(prefijoControl +"pnlMensajeUsuario");
  var lblTablaDatos = document.getElementById(prefijoControl +"lblTablaDatos");
  var lblGrafico = document.getElementById(prefijoControl +"lblGrafico");
  var txtKeyEstadistica = document.getElementById(prefijoControl +"txtKeyEstadistica");
  var keyEstadistica = txtKeyEstadistica.value;
  var queryString = "";
  var listadoDatosTipoEstadistica = "";

  try {
    var textoModal = generarTextoHtmlModal("Generando estadistica, espere un momento por favor...");
    jQuery.modal(textoModal,{minHeight: HEIGHT_MENSAJE_RESPUESTA, minWidth: WIDTH_MENSAJE_RESPUESTA});

    pnlMensajeUsuario.innerHTML = "";
    pnlMensajeUsuario.style.display = "none";
    lblTablaDatos.innerHTML = "";
    lblTablaDatos.style.display = "none";
    lblGrafico.innerHTML = "";
    lblGrafico.style.display = "none";
    listadoDatosTipoEstadistica = EST_ObtenerEstructuraDatosTipoEstadistica(keyEstadistica);
    //construye queryString
    queryString += "page=Workflow.HttpAjax";
    queryString += "&op=EST_"+ Url.encode(keyEstadistica);
    queryString += "&listadoDatos="+ Url.encode(listadoDatosTipoEstadistica);

    var okFunc = function(t) {
      var respuesta = jQuery.trim(t);
      if (respuesta == CONST_CODIGO_SQL_ERROR) {
        mostrarMensaje({
          nombreContenedor: prefijoControl +"pnlMensajeUsuario",
          tipo: "Error",
          mensaje: "Ha ocurrido un error interno y no se pudo obtener la estad&iacute;stica.",
          width: "300px",
          height: "25px",
          mostrarBotonCerrar: false,
          cerrarAutomatico: false
        });
      }
      else if (respuesta == CONST_CODIGO_SQL_SIN_DATOS) {
        mostrarMensaje({
          nombreContenedor: prefijoControl +"pnlMensajeUsuario",
          tipo: "Advertencia",
          mensaje: "No se encontraron registros.",
          width: "250px",
          height: "25px",
          mostrarBotonCerrar: true,
          cerrarAutomatico: false
        });
      }
      else {
        EST_DibujarGrafico(respuesta, keyEstadistica);
      }
      jQuery.modal.close();
    }
    var errFunc = function(t) {
      mostrarMensaje({
        nombreContenedor: prefijoControl +"pnlMensajeUsuario",
        tipo: "Error",
        mensaje: "Ha ocurrido un error interno y no se pudo obtener la estad&istica.",
        width: EST_WIDTH_MENSAJE,
        height: EST_HEIGHT_MENSAJE,
        mostrarBotonCerrar: false,
        cerrarAutomatico: false
      });
      jQuery.modal.close();
    }
    jQuery.ajax({
      url: "index.php",
      type: "post",
      async: false,
      data: queryString,
      success: okFunc,
      error: errFunc
    });

  }
  catch(e){
    if (e.description){ //para IE
      alert("Exception:\n" + e.description)
    }
    else{ // otro navegador
      alert("Exception:\n" + e)
    }
    jQuery.modal.close();
    return false;
  }
}


//###########################################################################
//# EST_SetVisiblesControles<tipo_Estadistica>
//###########################################################################
//------------------------------------------------------------------------------------------------------------------
//Descripcion : activa o desactiva todos los controles segun como lo indique el valor esVisible
//Por         : VSR, 18/04/2012
function EST_SetVisibleControlesFull(esVisible){
  var pnlMensajeUsuario = document.getElementById(prefijoControl +"pnlMensajeUsuario");
  var lblTablaDatos = document.getElementById(prefijoControl +"lblTablaDatos");
  var lblGrafico = document.getElementById(prefijoControl +"lblGrafico");
  pnlMensajeUsuario.style.display = "none";
  lblTablaDatos.style.display = "none";
  lblGrafico.style.display = "none";

  EST_SetVisibleControlesGenerales(esVisible);
  EST_SetVisibleControlesFlujosPorEstado(esVisible);
  EST_SetVisibleControlesPorcentajePorAprobador(esVisible);
}

//------------------------------------------------------------------------------------------------------------------
//Descripcion : activa o desactiva los controles generales
//Por         : VSR, 18/04/2012
function EST_SetVisibleControlesGenerales(esVisible){
  var hFiltroFechaDesde = document.getElementById(prefijoControl + "hFiltroFechaDesde");
  var txtFiltroFechaDesde = document.getElementById(prefijoControl + "txtFiltroFechaDesde");
  var hFiltroFechaHasta = document.getElementById(prefijoControl + "hFiltroFechaHasta");
  var txtFiltroFechaHasta = document.getElementById(prefijoControl + "txtFiltroFechaHasta");
  var hTipoGrafico = document.getElementById(prefijoControl + "hTipoGrafico");

  //valores por defecto
  var display = "block";

  //si se tiene que activar los controles entonces cambian las propiedades
  if(!esVisible){
    display = "none";
  }
  //setea las propiedades
  hFiltroFechaDesde.style.display = display;
  hFiltroFechaHasta.style.display = display;
  hTipoGrafico.style.display = display;

  //limpia los controles
  formatearEstiloNormal(txtFiltroFechaDesde,"", true, false, "", "");
  formatearEstiloNormal(txtFiltroFechaHasta,"", true, false, "", "");
}

//------------------------------------------------------------------------------------------------------------------
//Descripcion : activa o desactiva los controles "PorcentajePorAprobador"
//Por         : VSR, 14/04/2012
function EST_SetVisibleControlesPorcentajePorAprobador(esVisible){
  var hFiltroFechaDesde = document.getElementById(prefijoControl + "hFiltroFechaDesde");
  var txtFiltroFechaDesde = document.getElementById(prefijoControl + "txtFiltroFechaDesde");
  var hFiltroFechaHasta = document.getElementById(prefijoControl + "hFiltroFechaHasta");
  var txtFiltroFechaHasta = document.getElementById(prefijoControl + "txtFiltroFechaHasta");
  var hTipoGrafico = document.getElementById(prefijoControl + "hTipoGrafico");

  //valores por defecto
  var display = "block";

  //si se tiene que activar los controles entonces cambian las propiedades
  if(!esVisible){
    display = "none";
  }
  //setea las propiedades
  hFiltroFechaDesde.style.display = display;
  hFiltroFechaHasta.style.display = display;
  hTipoGrafico.style.display = display;

  //limpia los controles
  formatearEstiloNormal(txtFiltroFechaDesde,"", true, false, "", "");
  formatearEstiloNormal(txtFiltroFechaHasta,"", true, false, "", "");
}

//------------------------------------------------------------------------------------------------------------------
//Descripcion : activa o desactiva los controles "FlujosPorEstado"
//Por         : VSR, 14/04/2012
function EST_SetVisibleControlesFlujosPorEstado(esVisible){
  var hFiltroFechaDesde = document.getElementById(prefijoControl + "hFiltroFechaDesde");
  var txtFiltroFechaDesde = document.getElementById(prefijoControl + "txtFiltroFechaDesde");
  var hFiltroFechaHasta = document.getElementById(prefijoControl + "hFiltroFechaHasta");
  var txtFiltroFechaHasta = document.getElementById(prefijoControl + "txtFiltroFechaHasta");
  var hTipoGrafico = document.getElementById(prefijoControl + "hTipoGrafico");

  //valores por defecto
  var display = "block";

  //si se tiene que activar los controles entonces cambian las propiedades
  if(!esVisible){
    display = "none";
  }
  //setea las propiedades
  hFiltroFechaDesde.style.display = display;
  hFiltroFechaHasta.style.display = display;
  hTipoGrafico.style.display = display;

  //limpia los controles
  formatearEstiloNormal(txtFiltroFechaDesde,"", true, false, "", "");
  formatearEstiloNormal(txtFiltroFechaHasta,"", true, false, "", "");
}


//###########################################################################
//# EST_ValidarControles<tipo_Estadistica>
//###########################################################################
//----------------------------------------------------------------------------------------------------------------
//Descripcion: valida los datos ingresados en el formulario de busqueda
//Por        : VSR, 18/04/2012
function EST_ValidarFormulario(){
  validationEngineClearCountCustomError();
  var ddlEstadistica  = document.getElementById(prefijoControl + "ddlEstadistica_ddlCombo");
  var txtKeyEstadistica = document.getElementById(prefijoControl +"txtKeyEstadistica");

  //valida Tipo Estadistica
  if(IsValid_ComboVacio(ddlEstadistica)){
    jQuery.validationEngine.addPromptError(prefijoControl + "ddlEstadistica_ddlCombo", "* Este campo es requerido");
  }
  else{
    jQuery.validationEngine.removePrompt(prefijoControl + "ddlEstadistica_ddlCombo");
  }

  //valida controles por tipo Estadistica
  GEN_MostrarMensajesError(EST_ValidarControles(txtKeyEstadistica));

  var retorno = jQuery(NOMBRE_FORM_PRADO_JQUERY).validationEngine({returnIsValid: true});
  if (retorno) {
    EST_GenerarEstadistica();
  }
  return false;
}

//------------------------------------------------------------------------------------------------------------------
//Descripcion : valida los datos ingresados en los controles asociados al tipo de Estadistica
//Por         : VSR, 18/04/2012
function EST_ValidarControles(txtKeyEstadistica){
  var msgError = "";
  //si no selecciona ningun valor entonces oculta todos los controles
  if(!IsValid_Empty(txtKeyEstadistica)){
    //obtiene la key para saber que controles mostrar
    var keyEstadistica = txtKeyEstadistica.value;
    switch(keyEstadistica){
      case KEY_TIPO_ESTADISTICA_PORCENTAJE_POR_APROBADOR :
        msgError += EST_ValidarControlesPorcentajePorAprobador();
        break;
      case KEY_TIPO_ESTADISTICA_FLUJOS_POR_ESTADO:
        msgError += EST_ValidarControlesFlujosPorEstado();
        break;
      default:
        msgError += EST_ValidarControlesGenerales();
    }
  }
  return eval("["+ msgError +"]");
}

//------------------------------------------------------------------------------------------------------------------
//Descripcion : valida los datos ingresados en los controles generales
//Por         : VSR, 14/04/2012
function EST_ValidarControlesGenerales() {
  var msgError = "";
  var jsonMensajeError = "{\"control\":\"{$CONTROL}\",\"mensaje\":\"{$MENSAJE}\"}";
  var auxJSONMensajeError = "";
  var txtFiltroFechaDesde = document.getElementById(prefijoControl + "txtFiltroFechaDesde");
  var txtFiltroFechaHasta = document.getElementById(prefijoControl + "txtFiltroFechaHasta");

  //valida Fecha Desde
  auxJSONMensajeError = jsonMensajeError;
  if(!IsValid_Empty(txtFiltroFechaDesde)){
    if(!IsValid_Date(txtFiltroFechaDesde)){
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "* Fecha inv&aacute;lida");
      msgError += ((msgError=="") ? "":",") + auxJSONMensajeError;
    }
    else {
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "");
      msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
    }
  } else {
    auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "");
    msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
  }

  //valida Fecha Hasta
  auxJSONMensajeError = jsonMensajeError;
  if(!IsValid_Empty(txtFiltroFechaHasta)){
    if(!IsValid_Date(txtFiltroFechaHasta)){
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaHasta.id).replace("{$MENSAJE}", "* Fecha inv&aacute;lida");
      msgError += ((msgError=="") ? "":",") + auxJSONMensajeError;
    }
    else {
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaHasta.id).replace("{$MENSAJE}", "");
      msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
    }
  } else {
    auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaHasta.id).replace("{$MENSAJE}", "");
    msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
  }

  //valida que la fecha de hasta no sea menor que fecha desde
  auxJSONMensajeError = jsonMensajeError;
  if(!IsValid_Empty(txtFiltroFechaDesde) && !IsValid_Empty(txtFiltroFechaHasta) && IsValid_Date(txtFiltroFechaDesde) && IsValid_Date(txtFiltroFechaHasta)){
    //construye objetos fechas para compararlos
    var newFechaDesde = getDate(txtFiltroFechaDesde.value, "00:00");
    var newFechaHasta = getDate(txtFiltroFechaHasta.value, "00:00");

    //compara las fechas, si hay error muestra mensaje sino envia formulario
    if(newFechaDesde > newFechaHasta) {
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "* No puede ser mayor que Fecha Hasta");
      msgError += ((msgError=="") ? "":",") + auxJSONMensajeError;
    }
    else{
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "");
      msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
    }
  }

  return msgError;
}

//------------------------------------------------------------------------------------------------------------------
//Descripcion : valida los datos ingresados en los controles "POrcentajePorAprobador"
//Por         : VSR, 18/04/2012
function EST_ValidarControlesPorcentajePorAprobador() {
  var msgError = "";
  var jsonMensajeError = "{\"control\":\"{$CONTROL}\",\"mensaje\":\"{$MENSAJE}\"}";
  var auxJSONMensajeError = "";
  var txtFiltroFechaDesde = document.getElementById(prefijoControl + "txtFiltroFechaDesde");
  var txtFiltroFechaHasta = document.getElementById(prefijoControl + "txtFiltroFechaHasta");

  //valida Fecha Desde
  auxJSONMensajeError = jsonMensajeError;
  if(!IsValid_Empty(txtFiltroFechaDesde)){
    if(!IsValid_Date(txtFiltroFechaDesde)){
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "* Fecha inv&aacute;lida");
      msgError += ((msgError=="") ? "":",") + auxJSONMensajeError;
    }
    else {
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "");
      msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
    }
  } else {
    auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "");
    msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
  }

  //valida Fecha Hasta
  auxJSONMensajeError = jsonMensajeError;
  if(!IsValid_Empty(txtFiltroFechaHasta)){
    if(!IsValid_Date(txtFiltroFechaHasta)){
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaHasta.id).replace("{$MENSAJE}", "* Fecha inv&aacute;lida");
      msgError += ((msgError=="") ? "":",") + auxJSONMensajeError;
    }
    else {
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaHasta.id).replace("{$MENSAJE}", "");
      msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
    }
  } else {
    auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaHasta.id).replace("{$MENSAJE}", "");
    msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
  }

  //valida que la fecha de hasta no sea menor que fecha desde
  auxJSONMensajeError = jsonMensajeError;
  if(!IsValid_Empty(txtFiltroFechaDesde) && !IsValid_Empty(txtFiltroFechaHasta) && IsValid_Date(txtFiltroFechaDesde) && IsValid_Date(txtFiltroFechaHasta)){
    //construye objetos fechas para compararlos
    var newFechaDesde = getDate(txtFiltroFechaDesde.value, "00:00");
    var newFechaHasta = getDate(txtFiltroFechaHasta.value, "00:00");

    //compara las fechas, si hay error muestra mensaje sino envia formulario
    if(newFechaDesde > newFechaHasta) {
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "* No puede ser mayor que Fecha Hasta");
      msgError += ((msgError=="") ? "":",") + auxJSONMensajeError;
    }
    else{
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "");
      msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
    }
  }

  return msgError;
}

//------------------------------------------------------------------------------------------------------------------
//Descripcion : valida los datos ingresados en los controles "FlujosPorEstado"
//Por         : VSR, 14/04/2012
function EST_ValidarControlesFlujosPorEstado() {
  var msgError = "";
  var jsonMensajeError = "{\"control\":\"{$CONTROL}\",\"mensaje\":\"{$MENSAJE}\"}";
  var auxJSONMensajeError = "";
  var txtFiltroFechaDesde = document.getElementById(prefijoControl + "txtFiltroFechaDesde");
  var txtFiltroFechaHasta = document.getElementById(prefijoControl + "txtFiltroFechaHasta");

  //valida Fecha Desde
  auxJSONMensajeError = jsonMensajeError;
  if(!IsValid_Empty(txtFiltroFechaDesde)){
    if(!IsValid_Date(txtFiltroFechaDesde)){
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "* Fecha inv&aacute;lida");
      msgError += ((msgError=="") ? "":",") + auxJSONMensajeError;
    }
    else {
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "");
      msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
    }
  } else {
    auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "");
    msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
  }

  //valida Fecha Hasta
  auxJSONMensajeError = jsonMensajeError;
  if(!IsValid_Empty(txtFiltroFechaHasta)){
    if(!IsValid_Date(txtFiltroFechaHasta)){
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaHasta.id).replace("{$MENSAJE}", "* Fecha inv&aacute;lida");
      msgError += ((msgError=="") ? "":",") + auxJSONMensajeError;
    }
    else {
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaHasta.id).replace("{$MENSAJE}", "");
      msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
    }
  } else {
    auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaHasta.id).replace("{$MENSAJE}", "");
    msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
  }

  //valida que la fecha de hasta no sea menor que fecha desde
  auxJSONMensajeError = jsonMensajeError;
  if(!IsValid_Empty(txtFiltroFechaDesde) && !IsValid_Empty(txtFiltroFechaHasta) && IsValid_Date(txtFiltroFechaDesde) && IsValid_Date(txtFiltroFechaHasta)){
    //construye objetos fechas para compararlos
    var newFechaDesde = getDate(txtFiltroFechaDesde.value, "00:00");
    var newFechaHasta = getDate(txtFiltroFechaHasta.value, "00:00");

    //compara las fechas, si hay error muestra mensaje sino envia formulario
    if(newFechaDesde > newFechaHasta) {
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "* No puede ser mayor que Fecha Hasta");
      msgError += ((msgError=="") ? "":",") + auxJSONMensajeError;
    }
    else{
      auxJSONMensajeError = auxJSONMensajeError.replace("{$CONTROL}", txtFiltroFechaDesde.id).replace("{$MENSAJE}", "");
      msgError += ((msgError == "") ? "" : ",") + auxJSONMensajeError;
    }
  }

  return msgError;
}


//###########################################################################
//# EST_ObtenerEstructuraValores<tipo_Estadistica>
//###########################################################################
//------------------------------------------------------------------------------------------------------------------
//Descripcion : obtiene valores de los controles en una estructura json
//Por         : VSR, 18/04/2012
function EST_ObtenerEstructuraDatosTipoEstadistica(keyTipoEstadistica){
  var estructura = "";
  //obtiene la key para saber que controles mostrar
  switch(keyTipoEstadistica){
    case KEY_TIPO_ESTADISTICA_PORCENTAJE_POR_APROBADOR:
      estructura = EST_ObtenerEstructuraValoresPorcentajePorAprobador();
      break;
    case KEY_TIPO_ESTADISTICA_FLUJOS_POR_ESTADO:
      estructura = EST_ObtenerEstructuraValoresFlujosPorEstado();
      break;
    default:
      estructura = EST_ObtenerEstructuraValoresGenerales();
  }
  return estructura;
}

//------------------------------------------------------------------------------------------------------------------
//Descripcion : obtiene valores de los controles en una estructura json "Generales"
//Por         : VSR, 18/04/2012
function EST_ObtenerEstructuraValoresGenerales(){
  var json = "";
  var ddlEstadistica = document.getElementById(prefijoControl +"ddlEstadistica_ddlCombo");
  var txtFiltroFechaDesde = document.getElementById(prefijoControl + "txtFiltroFechaDesde");
  var txtFiltroFechaHasta = document.getElementById(prefijoControl + "txtFiltroFechaHasta");
  var txtIdEmpresa = document.getElementById(prefijoControl + "txtIdEmpresa");

  json +="{";
  json +=" \"idEstadistica\":\""+ Url.encode(ddlEstadistica.value)+"\"";
  json +=",\"fechaDesde\":\""+ Url.encode(txtFiltroFechaDesde.value)+"\"";
  json +=",\"fechaHasta\":\""+ Url.encode(txtFiltroFechaHasta.value)+"\"";
  json +=",\"idEmpresa\":\""+ Url.encode(txtIdEmpresa.value)+"\"";
  json +="}";

  return json;
}

//------------------------------------------------------------------------------------------------------------------
//Descripcion : obtiene valores de los controles en una estructura json "PorcentajePorAprobador"
//Por         : VSR, 18/04/2012
function EST_ObtenerEstructuraValoresPorcentajePorAprobador(){
  var json = "";
  var ddlEstadistica = document.getElementById(prefijoControl +"ddlEstadistica_ddlCombo");
  var txtFiltroFechaDesde = document.getElementById(prefijoControl + "txtFiltroFechaDesde");
  var txtFiltroFechaHasta = document.getElementById(prefijoControl + "txtFiltroFechaHasta");
  var txtIdEmpresa = document.getElementById(prefijoControl + "txtIdEmpresa");

  json +="{";
  json +=" \"idEstadistica\":\""+ Url.encode(ddlEstadistica.value)+"\"";
  json +=",\"fechaDesde\":\""+ Url.encode(txtFiltroFechaDesde.value)+"\"";
  json +=",\"fechaHasta\":\""+ Url.encode(txtFiltroFechaHasta.value)+"\"";
  json +=",\"idEmpresa\":\""+ Url.encode(txtIdEmpresa.value)+"\"";
  json +="}";

  return json;
}

//------------------------------------------------------------------------------------------------------------------
//Descripcion : obtiene valores de los controles en una estructura json "FlujosPorEstado"
//Por         : VSR, 18/04/2012
function EST_ObtenerEstructuraValoresFlujosPorEstado(){
  var json = "";
  var ddlEstadistica = document.getElementById(prefijoControl +"ddlEstadistica_ddlCombo");
  var txtFiltroFechaDesde = document.getElementById(prefijoControl + "txtFiltroFechaDesde");
  var txtFiltroFechaHasta = document.getElementById(prefijoControl + "txtFiltroFechaHasta");
  var txtIdEmpresa = document.getElementById(prefijoControl + "txtIdEmpresa");

  json +="{";
  json +=" \"idEstadistica\":\""+ Url.encode(ddlEstadistica.value)+"\"";
  json +=",\"fechaDesde\":\""+ Url.encode(txtFiltroFechaDesde.value)+"\"";
  json +=",\"fechaHasta\":\""+ Url.encode(txtFiltroFechaHasta.value)+"\"";
  json +=",\"idEmpresa\":\""+ Url.encode(txtIdEmpresa.value)+"\"";
  json +="}";

  return json;
}

//###########################################################################
//# EST_DibujarGrafico<tipo_Estadistica>
//###########################################################################
function EST_DibujarGrafico(estructuraJSON, keyEstadistica){
  var lblTablaDatos = document.getElementById(prefijoControl +"lblTablaDatos");
  var elemLblGrafico = prefijoControl + "lblGrafico";
  var lblGrafico = document.getElementById(elemLblGrafico);
  var data = jQuery.parseJSON(estructuraJSON);

  if(data){
    lblTablaDatos.innerHTML = "";
    lblTablaDatos.style.display = "block";
    lblGrafico.innerHTML = "";
    lblGrafico.style.display = "block";

    //dibuja la tabla con los datos
    var jsonTablaHTML = data.jsonTablaHTML;

    lblTablaDatos.innerHTML = createTableView({
      objArray:jsonTablaHTML,
      widthTable:"250px"
    });

    //obtiene la key para saber que controles mostrar
    switch(data.tipo){
      case GRAFICO_BARRA:
        EST_GraficoBarra(estructuraJSON,elemLblGrafico);
        break;
      case GRAFICO_TORTA:
        EST_GraficoTorta(estructuraJSON,elemLblGrafico);
        break;
      default:
        lblGrafico.innerHTML = "";
    }
  } else {
    lblTablaDatos.style.display = "none";
    lblGrafico.style.display = "none";
  }
}

//------------------------------------------------------------------
//Descripcion : dibuja el grafico tipo BARRA
//Por         : VSR, 18/04/2012
function EST_GraficoBarra(estructuraJSON, nombreContenedor) {
  var objContenedor = document.getElementById(nombreContenedor);
  var datosJSON = jQuery.parseJSON(estructuraJSON);
  if (datosJSON) {
    var colors = Highcharts.getOptions().colors;
    var titulo = datosJSON.titulo;
    var tituloEjeY = datosJSON.tituloEjeY;
    var nombreSerie = datosJSON.nombreSerie;
    var categorias = eval(datosJSON.categorias);
    var datos = eval(datosJSON.datos);

    chart = new Highcharts.Chart({
      chart: {
        renderTo: nombreContenedor,
        type: 'column', // column | pie | line | spline
        width: 450,
        height: 300
      },
      title: {
        text: titulo,
        style: {
          font: 'bold 20px Arial, sans-serif',
          color: '#666'
        }
      },
      xAxis: {
        categories: categorias
      },
      yAxis: {
        title: {
          text: tituloEjeY,
          style: {
            font: 'bold 17px Arial, sans-serif',
            color: '#666'
          }
        }
      },
      tooltip: {
        formatter: function () {
          var point = this.point,
               s = this.x + ':<b>' + this.y + '</b><br/>';
          return s;
        }
      },
      series: [{
        name: nombreSerie,
        data: datos,
        color: 'white',
        dataLabels: {
          enabled: true,
          color: '#666',
          align: 'center',
          x: 0,
          y: -3,
          formatter: function () {
            return this.y;
          },
          style: {
            font: 'bold 13px Arial, sans-serif',
            color: '#666'
          }
        }
      }],
      exporting: {
        enabled: true
      }
    });

  } else {
    objContenedor.innerHTML = ""
  }

}


//------------------------------------------------------------------
//Descripcion : dibuja el grafico tipo TORTA
//Por         : VSR, 18/04/2012
function EST_GraficoTorta(estructuraJSON, nombreContenedor) {
  var objContenedor = document.getElementById(nombreContenedor);
  var datosJSON = jQuery.parseJSON(estructuraJSON);
  if (datosJSON) {
    var titulo = datosJSON.titulo;
    var nombreSerie = datosJSON.nombreSerie;
    var datos = eval(datosJSON.datos);
    chart = new Highcharts.Chart({
      chart: {
        renderTo: nombreContenedor,
        type : 'pie',
        plotBackgroundColor: null,
        plotBorderWidth: null,
        plotShadow: false,
        width: 600,
        height: 300
      },
      title: {
        text: titulo
      },
      tooltip: {
        formatter: function() {
          return '<b>'+ this.point.name +'</b>: '+ roundNumber(this.percentage,2) +' %';
        }
      },
      plotOptions: {
        pie: {
          allowPointSelect: true,
          cursor: 'pointer',
          dataLabels: {
            enabled: true,
            color: '#000000',
            connectorColor: '#000000',
            formatter: function() {
              return '<b>'+ this.point.name +'</b>: '+ roundNumber(this.percentage,2) +' %';
            }
          }
        }
      },
      series: [{
        name: nombreSerie,
        data: datos
      }]
    });

  } else {
    objContenedor.innerHTML = ""
  }

}

